package pers.mobian.aop;

import org.springframework.cglib.proxy.*;

import java.lang.reflect.Method;

/**
 * @Date 2021/10/10 19:37
 * @Created mobian 多个拦截器的过滤使用
 * @Description
 */
public class CglibTest2 {
	public static void main(String[] args) {

		UserServiceImpl userService = new UserServiceImpl();
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(UserServiceImpl.class);
		// 设置对应的回调方法
		enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {
			@Override
			public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
				System.out.println("开始2");

				// 使用该方式进行方法调用时,可以省略实例化第一步创建的对象
				Object result = methodProxy.invokeSuper(o, objects);
				System.out.println("完成2");
				return result;
			}
			// 由于该拦截器是一个数组,所以可以添加多个拦截器
			// 再添加一个interceptor拦截器,该拦截器不进行任何处理NoOp INSTANCE = new NoOp() {};
		}, NoOp.INSTANCE});

		// 设置对应的回调过滤器
		enhancer.setCallbackFilter(new CallbackFilter() {
			@Override
			public int accept(Method method) {
				if(method.getName().equals("test")) {
					return 1;
					// 当调用的方法名字为show时,使用数组下标为0的interceptor
				} else if (method.getName().equals("show")){
					return 0;
				}
				// 默认使用数组下标为1的interceptor
				return 1;
			}
		});

		UserServiceImpl o = (UserServiceImpl) enhancer.create();
		o.show();
		System.out.println("---");
		o.test();


	}
}
